package com.chenhs.oop.study.IO流;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @className: com.chenhs.oop.study.IO流-> IO1FileInputStrom
 * @description: 这个类是做做什么得吖，小朋友？ fileInputStrom
 * @author: chenhs
 * @createDate: 2022-12-10 22:27
 * @version: 1.0
 */
public class IO1FileInputStream {
    @Test
    public void t() throws IOException {
        String path = "D:\\temp\\temp1\\temp\\test.txt";
        int read = 0;
        FileInputStream inputStream = new FileInputStream(path);
        //每次读一个字节，如果读到最后没有内容返回-1
        while ((read = inputStream.read()) != -1) {
            System.out.println((char) read);
        }
        inputStream.close();
    }

    @Test
    public void t2() throws IOException {
        String path = "D:\\temp\\temp1\\temp\\test.txt";
//本次读取的长度，如果没有读取到内容，这个长度为-1
        int len = 0;
//        一次读取8个字节，也可以是1024字节。
        byte[] red = new byte[8];
        FileInputStream inputStream = new FileInputStream(path);
//         每次读一个字节，如果读到最后没有内容返回-1
        while ((len = inputStream.read(red)) != -1) {
//            取出byte数组中的数据，转化字符串，范围是0到当前取出数据的长度。
//           这么写的好处,1当第一次读取不足8个时,相对于与写死读取到8,不会报数组下标越界异常.当多次读取,最后一次读取不满8时,不会读取到上次读取的内容.
//            比如一堆香肠，一刀乱砍下去，大概率得到的是不完整的一节香肠。
            System.out.println("------------开始------------------");
            System.out.println(new String(red, 0, len));
            System.out.println("-------------结束-----------------");
        }
        inputStream.close();
    }
    /**
     * @title t3
     * @description bytp转码为中文 不推荐这种方式，如果字符内容，直接用字符流。这里就是玩。有可能一个字符的字节读进了两个字节数组，这不传不过来了嘛。
     * @author cehnhs
     * @param
     * @updateTime 2022/12/11 10:58
     * @return
     */
    @Test
    public void t3() throws IOException {
        String path = "D:\\temp\\temp1\\temp\\test2.txt";
//本次读取的长度，如果没有读取到内容，这个长度为-1
        int len = 0;
//        一次读取8个字节，也可以是1024字节。
        byte[] red = new byte[1024];
        FileInputStream inputStream = new FileInputStream(path);
//         每次读一个字节，如果读到最后没有内容返回-1
        while ((len = inputStream.read(red)) != -1) {
//            取出byte数组中的数据，转化字符串，范围是0到当前取出数据的长度。
//           这么写的好处,1当第一次读取不足8个时,相对于与写死读取到8,不会报数组下标越界异常.当多次读取,最后一次读取不满8时,不会读取到上次读取的内容.
            System.out.println("------------开始------------------");
            System.out.println(new String(red, StandardCharsets.UTF_8));
            System.out.println("-------------结束-----------------");
        }
        inputStream.close();
    }
}
